Install PostgreSQL on AWS EC2(Amazon Linux AMI 2013.03.1)
ちょっとした調査作業の一環でPostgreSQL on EC2の動作環境を作成してみようと思い、このエントリを書いてみました。基本的には以前書かれたこちらの記事と流れは同じなのですが、別の手法で同等(バージョン)の環境が導入出来たので備忘録がてら残しておきます。
EC2インスタンスの準備
まずはPostgreSQLインストール用のEC2インスタンスを1つ、用意します。
- イメージは特に拘りは無いので『Amazon Linux AMI 2013.03.1』を利用
- VPCを作成、そこに紐付ける形でEC2インスタンスを作成(タイプも特に気にしないのでt1.microで)
- セキュリティグループの指定:任意のグループを作成しSSH(22)、HTTP(80)を選択で追加、また併せて値入力でPostgreSQL用の接続ポート(5432)を追加
- TagもEC2認識用の内容を適当に設定
- Elastic IPを取得し、作成したEC2に割り当て
用意が出来たらEC2インスタンスへアクセス。
$ ssh -i aws-research-key.pem [email protected] The authenticity of host 'ec2-XX-XXX-XXX-XX.ap-northeast-1.compute.amazonaws.com (XX.XXX.XXX.XX)' can't be established. RSA key fingerprint is XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'ec2-XX-XXX-XXX-XX.ap-northeast-1.compute.amazonaws.com,XX.XXX.XXX.XX' (RSA) to the list of known hosts. __| __|_ ) _| ( / Amazon Linux AMI ___|\___|___| https://aws.amazon.com/amazon-linux-ami/2013.03-release-notes/ There are 6 security update(s) out of 13 total update(s) available Run "sudo yum update" to apply all updates. $
PostgreSQLのインストール
PostgreSQL及びPostgreSQLインストールに必要なパッケージ各種を導入。ググった結果の中では全体更新の後『uuid.i686』も導入していましたが、その場合だと最後のpostgresql関連のパッケージインストール時に内容が衝突するので対象から外しました。
$ sudo yum update -y $ sudo yum install -y libxslt.i686 $ sudo yum install -y postgresql postgresql-server postgresql-devel postgresql-contrib postgresql-docs Loaded plugins: priorities, security, update-motd, upgrade-helper Setting up Install Process Resolving Dependencies --> Running transaction check ---> Package postgresql.noarch 0:9.2-1.19.amzn1 will be installed : (中略) : Verifying : postgresql-server-9.2-1.19.amzn1.noarch 11/12 Verifying : postgresql-devel-9.2-1.19.amzn1.noarch 12/12 Installed: postgresql.noarch 0:9.2-1.19.amzn1 postgresql-contrib.noarch 0:9.2-1.19.amzn1 postgresql-devel.noarch 0:9.2-1.19.amzn1 postgresql-docs.noarch 0:9.2-1.19.amzn1 postgresql-server.noarch 0:9.2-1.19.amzn1 Dependency Installed: postgresql9.x86_64 0:9.2.4-1.35.amzn1 postgresql9-contrib.x86_64 0:9.2.4-1.35.amzn1 postgresql9-devel.x86_64 0:9.2.4-1.35.amzn1 postgresql9-docs.x86_64 0:9.2.4-1.35.amzn1 postgresql9-libs.x86_64 0:9.2.4-1.35.amzn1 postgresql9-server.x86_64 0:9.2.4-1.35.amzn1 uuid.x86_64 0:1.6.2-11.16.amzn1 Complete!
導入バージョン確認。上記操作では現在9.2.4が入るようです。
$ psql --version psql (PostgreSQL) 9.2.4
サービスの起動・停止・再起動
まずは現状構成で動作するかどうかを確認してみます。ec2-userで実行。
## 初期化(PostgreSQLインストール後には必ず実施) $ sudo /sbin/service postgresql initdb Initializing database: [ OK ] ## 起動・停止・再起動 [ec2-user@ip-xx-xxx-xxx-XXX ~]$ sudo /sbin/service postgresql start Starting postgresql service: [ OK ] [ec2-user@ip-xx-xxx-xxx-XXX ~]$ sudo /sbin/service postgresql stop Stopping postgresql service: [ OK ] [ec2-user@ip-xx-xxx-xxx-XXX ~]$ sudo /sbin/service postgresql restart Stopping postgresql service: [ OK ] Starting postgresql service: [ OK ]
サービスの自動起動化設定
必要に応じて以下の自動起動設定を行なってください。
$ sudo /sbin/chkconfig --list | grep postgresql postgresql 0:off 1:off 2:off 3:off 4:off 5:off 6:off $ sudo /sbin/chkconfig postgresql on $ sudo /sbin/chkconfig --list | grep postgresql postgresql 0:off 1:off 2:on 3:on 4:on 5:on 6:off
接続諸設定(ユーザー:postgres)
postgresユーザのパスワードを変更
ec2-userにてPostgreSQL用ユーザーpostgresのパスワードを変更します。
$ sudo passwd postgres ユーザー postgres のパスワードを変更。 新しいパスワード:(**************) 新しいパスワードを再入力してください:(**************) passwd: 全ての認証トークンが正しく更新できました。
ユーザが変更出来ることを確認してみます。(確認出来たらec2-userに戻る)
$ su - postgres パスワード: -bash-4.1$ exit -bash-4.1$ $
環境諸設定
次は今回のエントリ用に接続設定等を少々変更。PostgreSQLの起動ファイルから設定内容を一部確認してみます。実行プログラムの中身を覗いてみると、パス情報はこんな設定内容になっておりました。
$ vi /etc/init.d/postgresql ------------------------------- PGVERSION=9.2.4 PREVMAJORVERSION=9.1 PREVPGENGINE=/usr/lib64/pgsql/postgresql-9.1/bin PGDOCDIR=/usr/share/doc/postgresql9-9.2.4 # Set defaults for configuration variables PGENGINE=/usr/bin PGPORT=5432 PGDATA=/var/lib/pgsql9/data PGLOG=/var/lib/pgsql9/pgstartup.log
DB接続ユーザの作成
設定ファイルpostgresql.confを編集。listen_addressは行先頭のコメントを除去し内容を『*』に変更。
$ su - postgres $ vi /var/lib/pgsql9/data/postgresql.conf ----- #------------------------------------------------------------------------------ # CONNECTIONS AND AUTHENTICATION #------------------------------------------------------------------------------ # - Connection Settings - listen_addresses = '*' # what IP address(es) to listen on; # comma-separated list of addresses; # defaults to 'localhost'; use '*' for all # (change requires restart) port = 5432 # (change requires restart)
次いでpg_hba.confの編集。ここは以下の様に最低限の設定でひとまず進めます。
$ vi /var/lib/pgsql9/data/pg_hba.conf ## ファイル内有効行全コメント→末尾に追加 local all all trust host all all 0.0.0.0/0 md5
設定内容が有効な状態になっているかの確認も兼ねてec2-userで起動停止を確認。
$ sudo /sbin/service postgresql stop Stopping postgresql service: [ OK ] $ sudo /sbin/service postgresql start Starting postgresql service: [ OK ] $ sudo /sbin/service postgresql restart Stopping postgresql service: [ OK ] Starting postgresql service: [ OK ]
DB接続用ユーザーの作成
postgresユーザとは別に、今回の動作確認用のDB接続ユーザーを作成します。まずは、実行ユーザをpostgresにチェンジ。
$ su - postgres パスワード: (***********) -bash-4.1$
ユーザー名 | cmtestuser |
パスワード | cmtestpass |
データベース | cmtestdb |
今回作業用の接続ユーザー及びパスワードの設定は上記内容とします。まずはDB接続ユーザー作成/パスワード設定。
$ createuser -AdPE cmtestuser Enter password for new role: (作成ユーザー名に対応するパスワードを設定) Enter it again: (上記内容を再入力) -bash-4.1$
ユーザーが利用するDBの作成(パスワードは上記作成ユーザのパスワードを入力)
$ createdb -E UTF8 -U cmtestuser -W cmtestdb Password: (**********) -bash-4.1$
以上でDBに関する接続ユーザー情報の設定は完了。postgresからec2-userに戻り、DBユーザに紐付くOS側のユーザー名・パスワードを作成。(※内容はDB作成時のユーザに関するものと同じです)
$ sudo adduser cmtestuser $ sudo passwd cmtestuser ユーザー cmtestuser のパスワードを変更。 新しいパスワード: (**************) 新しいパスワードを再入力してください: (**************) passwd: 全ての認証トークンが正しく更新できました。 $
接続確認(Local:CUI)
ユーザーをec2-userからcmtestuserに変更の後、psqlコマンド実行。結果としてDB名一覧の中に作成したものが含まれている事が確認出来ます。
$ su - cmtestuser パスワード: [cmtestuser@ip-xx-xxx-xxx-xxx ~]$ psql -l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+------------+----------+-------------+-------------+----------------------- cmtestdb | cmtestuser | UTF8 | en_US.UTF-8 | en_US.UTF-8 | postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres (4 rows) [cmtestuser@ip-xx-xxx-xxx-xxx ~]$ ¥q
テーブル作成SQLファイルの準備:幾つかのテーブルCREATE文を用意。
$ vi rs_gettingstarted.sql ------------------------- create table users( userid integer not null, username char(8), firstname varchar(30), lastname varchar(30), city varchar(30), state char(2), email varchar(100), phone char(14), likesports boolean, liketheatre boolean, likeconcerts boolean, likejazz boolean, likeclassical boolean, likeopera boolean, likerock boolean, likevegas boolean, likebroadway boolean, likemusicals boolean); create table venue( venueid smallint not null, venuename varchar(100), venuecity varchar(30), venuestate char(2), venueseats integer); create table category( catid smallint not null, catgroup varchar(10), catname varchar(10), catdesc varchar(50)); create table date( dateid smallint not null, caldate date not null, day character(3) not null, week smallint not null, month character(5) not null, qtr character(5) not null, year smallint not null, holiday boolean default('N')); create table event( eventid integer not null , venueid smallint not null, catid smallint not null, dateid smallint not null , eventname varchar(200), starttime timestamp); create table listing( listid integer not null , sellerid integer not null, eventid integer not null, dateid smallint not null , numtickets smallint not null, priceperticket decimal(8,2), totalprice decimal(8,2), listtime timestamp); create table sales( salesid integer not null, listid integer not null, sellerid integer not null, buyerid integer not null, eventid integer not null, dateid smallint not null, qtysold smallint not null, pricepaid decimal(8,2), commission decimal(8,2), saletime timestamp);
DBにログインし、上記SQLファイルを読み込み実行。
$ psql cmtestdb psql (9.2.4) Type "help" for help. cmtestdb=> \i /home/cmtestuser/rs_gettingstarted.sql CREATE TABLE CREATE TABLE CREATE TABLE CREATE TABLE CREATE TABLE CREATE TABLE CREATE TABLE COMMIT cmtestdb=>
テーブル一覧コマンド(¥d)で作成したテーブルを確認出来ました。
cmtestdb=> \d List of relations Schema | Name | Type | Owner --------+----------+-------+------------ public | category | table | cmtestuser public | date | table | cmtestuser public | event | table | cmtestuser public | listing | table | cmtestuser public | sales | table | cmtestuser public | users | table | cmtestuser public | venue | table | cmtestuser (7 rows) cmtestdb=>
接続確認(Remote:GUI)
ローカル:CUIでの接続確認が出来ました。次いで、リモート(今回は動作確認で使ったMac)からAWSのEC2内にインストールしたPostgreSQLのDBにアクセス出来るかどうかを確認してみます。
今回の接続確認にはpgAdminを使いました。Macの場合、pgAdmin: Download - Mac OSXからバージョンv1.16.1のアーカイブを入手、導入しました。
pgAdminを起動、必要な情報を設定。今回追加で設定欄を埋めた内容は以下の通り。
- 名前:任意の識別名称
- ホスト:EC2に割り当てたElastic IP
- パスワード:DB接続ユーザーのパスワード
無事、繋がりました!
まとめ
この手のエントリは直近・自分が導入したいバージョンや環境に即した情報がなかったりするので割と途中で『ん?』となりがちですよね。AWSだとPostgreSQLでもこのようにパッと環境を用意する事が出来たりします。早くRDSの仲間入りをして欲しいところですね。